package main

import (
	"fmt"
)

type Person struct{
	Name string
}

func test01(p Person){
	fmt.Println(p.Name)
} 

func test02(p *Person){
	fmt.Println(p.Name)
}

// 不管调用是什么  只看 这个方法是和哪个类型绑定的 
// 值 就是拷贝  指针 就是 指针 调用方式可以混淆
func (p Person) test03(){// 这里只是一个值拷贝
	fmt.Println(p.Name)
	p.Name="asd"
}

func (p *Person)  test04(){
	fmt.Println(p.Name)
} 

func main(){
	p:=Person{"tom"}
	// 如果是函数 如果接收的是什么类型 那就必须是什么类型
	test01(p)
	test02(&p)
	// 那么方法 应该怎么办呢
	fmt.Println(p)
	(&p).test03()// 上面还是 值拷贝  输出 tom 看起来是传了一个指针实际上是传了一个值拷贝
	fmt.Println(p)
	(&p).test04()
}